<?php
/**
 * Created by PhpStorm.
 * Adminuser: Administrator
 * Date: 2019/2/12 0012
 * Time: 下午 5:35
 */

namespace app\index\controller;
use app\common\Test;
//use think\facade\Config;
use think\view\driver\Think;

/**
 * Class Demo
 * @package app\index\controller
 * 容器和依赖注入的原理
 * --------------------------
 * 1：任何的url访问都会映射都控制器，由控制的某个方法执行
 * 2：一个控制器对应一个类 如果类都需要统一管理  怎么办？
 *   创建容器来管理     容器是什么？
 *   还可以将类的实列（对象）作为参数  传递给类的方法  自动触发依赖注入
 *
 * 依赖注入  ： 讲对象类型的数据以参数的方式传到方法的参数列表中
 *
 * URL   访问：可以通过get访问将数据传递到指定的方法中,但是只能传字符串或者数字
 *
 * 如果要传入对象怎么办？  就要应用依赖注入了！！！！！！！！！！  解决了向类中的方法传对象的问题
 */
class Demo
{
     //通过字符串或者数字用get的方法传值到类的方法中
    public function getname($name="王晔"){

        return  'hello---'.$name;
    }
    //测试依赖注入
    public function getMethod(\app\common\Test $test){
          $test->setName('王二爷');
          return $test->getName();

    }
    //绑定类到容器
    public function bindClass(){
        //1将类放到容器中  相当于注册到容器中
        //第一个参数为别名（标识）  第二个为类直接从命名空间开始写
        \think\Container::set('test','\app\common\Test');
        //将容器中的类实力实例化并取出来使用：实例化时候可以调用构造器进行初始化
        $test=\think\Container::get('test',['name'=>'王大爷！！！']);
            //助手函数
          //     bind('test','\app\common\Tests');
         //  $test= app('test',['name'=>'王大爷']);
        return $test->getName();
    }
    //绑定一个闭包到容器  可以理解为匿名函数
    public function bindClosure(){
        //1将闭包放到容器中
        \think\Container::set('test1',function ($domain){
            return '我是谁？我是你'.$domain ;
        });
        $test=\think\Container::get('test1',['domain'=>'王大爷！！！']);
        return $test;
    }

}